#ifndef DELAYDEVICESDK_H
#define DELAYDEVICESDK_H

#include "ControlModuleSDKInterface.h"
#include "DelayDevice.h"
#include <QMap>
#include <QWidget>
#include <QDialog>
#include "DelayDeviceParamsSet.h"
#include "DelayQuickParametesSet.h"

/**
 * @brief DelayDeviceSDK接口ID定义（不再用于插件识别，保留以兼容旧代码）
 */
#define DELAYDEVICESDK_IID "Camera.DelayDeviceSDK/1.0"

/**
 * @brief DelayDeviceSDK类 - 延时设备SDK实现
 * @details 该类继承自控制模块SDK接口，负责延时设备的管理、连接、参数设置和状态查询。
 *          SDK类作为设备和上层应用之间的桥梁，维护设备实例池，并将功能请求转发给相应的设备。
 *          提供了标准SDK接口实现和延时设备特定功能。
 */
class DelayDeviceSDK : public ControlModuleSDKInterface {
    Q_OBJECT
    // 明确声明实现通用SDK接口，确保qobject_cast与Qt插件识别一致
    Q_INTERFACES(SDKInterface)
    // 统一使用通用接口IID，便于框架识别
    Q_PLUGIN_METADATA(IID SDKINTERFACE_IID)
public:
    /**
     * @brief 构造函数
     * @param parent 父对象指针，用于内存管理和信号槽连接
     */
    explicit DelayDeviceSDK(QObject *parent = nullptr);
    
    /**
     * @brief 析构函数
     * @details 自动关闭所有设备连接并释放资源
     */
    ~DelayDeviceSDK() override;

    // 重写基类方法
    /**
     * @brief 获取SDK名称
     * @return SDK名称字符串
     */
    QString sdkName() const override;
    
    /**
     * @brief 获取SDK版本号
     * @return 版本号字符串，格式为"主版本.次版本.修订版本"
     */
    QString SDKVersion() const override;
    
    /**
     * @brief 打开设备连接
     * @param params 连接参数，通常为QString类型的设备IP地址
     * @return 连接成功返回true，失败返回false
     */
    bool openDevice(const QVariant& params) override;
    
    /**
     * @brief 关闭指定设备连接
     * @param params 设备标识符，通常为QString类型的设备IP地址
     */
    void closeDevice(const QVariant& params) override;
    
    /**
     * @brief 关闭所有已连接的设备
     * @details 依次关闭所有设备连接并释放资源
     */
    void closeAllDevices() override;
    
    /**
     * @brief 搜索可用的延时设备
     * @param devices 输出参数，存储搜索到的设备信息列表
     * @return 搜索成功且找到设备返回true，未找到设备返回false
     */
    bool searchDevices(QList<QVariant>& devices) override;

    /**
     * @brief 获取快速参数设置界面
     * @param deviceId 设备标识符
     * @param parent 父窗口部件指针
     * @return 参数设置界面指针，失败返回nullptr
     */
    QWidget* getQuickParametersWidget(const QVariant& deviceId, QWidget* parent = nullptr) override;
    
    /**
     * @brief 获取参数设置对话框
     * @param deviceId 设备标识符
     * @param parent 父窗口部件指针
     * @return 参数设置对话框指针，失败返回nullptr
     */
    QDialog* getParametersDialog(const QVariant& deviceId, QWidget* parent = nullptr) override;
    
    /**
     * @brief 获取预设参数设置对话框
     * @param deviceId 设备标识符
     * @param parent 父窗口部件指针
     * @return 预设参数设置对话框指针，失败返回nullptr
     */
    QDialog* getPresetParametersDialog(QWidget* parent = nullptr) override;
    
    /**
     * @brief 设置设备触发模式
     * @param deviceId 设备标识符
     * @param triggerMode 触发模式（0：实时采集，1：内触发，2：单次外触发，3：连续外触发）
     * @return 设置成功返回true，失败返回false
     */
    bool setDeviceTriggerMode(const QVariant& deviceId, int triggerMode) override;
    
    /**
     * @brief 设置设备参数
     * @param deviceId 设备ID
     * @param params 设备参数映射，使用QVariantMap作为万能变量类型
     * @return 设置成功返回true，失败返回false
     */
    bool setDeviceParameters(const QVariant& deviceId, const QVariantMap& params) override;
    
    /**
     * @brief 获取设备参数
     * @param deviceId 设备ID
     * @param configName 配置名称输出
     * @param params 设备参数映射输出，使用QVariantMap作为万能变量类型
     * @return 获取成功返回true，失败返回false
     */
    bool getDeviceParameters(const QVariant& deviceId, QString& configName, QVariantMap& params) override;
    
    /**
     * @brief 设置预设参数
     * @param params 预设参数映射，使用QVariantMap作为万能变量类型
     * @return 设置成功返回true，失败返回false
     */
    bool setPresetParameters(const QVariantMap& params) override;
    
    /**
     * @brief 获取预设参数
     * @param configName 配置名称输出
     * @param params 预设参数映射输出，使用QVariantMap作为万能变量类型
     * @return 获取成功返回true，失败返回false
     */
    bool getPresetParameters(QString& configName, QVariantMap& params) override;

private:
    struct DelayDeviceSDKInfo
    {
        // 设备对象
        DelayDevice* pDevice;
        // 快捷参数设置
        DelayQuickParametersSet* pParametersWidget;
        // 参数设置对话框
        DelayDeviceParamsSet* pParametersDialog;
    };
    /**
     * @brief 设备实例映射表
     * @details 存储已连接的设备实例，使用设备标识符（通常是IP地址）作为键
     *          便于通过设备ID快速查找对应的设备实例
     */
    QMap<QString, DelayDeviceSDKInfo*> m_deviceMap;
};

#endif // DELAYDEVICESDK_H
